package cn.spdb.harrier.common.log;

import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.filter.Filter;
import ch.qos.logback.core.spi.FilterReply;
import cn.spdb.harrier.common.utils.LoggerUtils;

public class ApplicationLogFilter extends Filter<ILoggingEvent> {
	
	private static LogbackPrintStream logbackPrintStream=new LogbackPrintStream(System.err);
	
	private Level level = Level.INFO;

	public void setLevel(String level) {
		this.level = Level.toLevel(level);
	}

/**
 * 根据日志事件的级别和来源（线程或 logger 名称）决定是否输出该日志。
 *
 * 该过滤器的逻辑如下：
 * - 所有 WARNING 及以上级别的日志都会被接受（ACCEPT）；
 * - 对于指定前缀（Master、Worker、Monitor、Alarm）的日志或任务相关的日志，
 *   仅当日志级别大于等于设定的 level 时才会被接受；
 * - 其他不符合条件的日志将被拒绝（DENY）。
 *
 * @param event 日志事件对象
 * @return FilterReply.ACCEPT 表示接受该日志，FilterReply.DENY 表示拒绝
 */
@Override
public FilterReply decide(ILoggingEvent event) {
    // 优先输出 warn 及以上级别日志
    if (event.getLevel().isGreaterOrEqual(Level.WARN)) {
        return FilterReply.ACCEPT;
    }
    // 拒绝特定组件或任务日志中低于设定级别的日志
    else if (
            event.getThreadName().startsWith("Master") ||
            event.getLoggerName().startsWith("Master") ||
            event.getThreadName().startsWith("Worker") ||
            event.getLoggerName().startsWith("Worker") ||
            event.getThreadName().startsWith("Monitor") ||
            event.getLoggerName().startsWith("Monitor") ||
            event.getThreadName().startsWith("Alarm") ||
            event.getLoggerName().startsWith("Alarm") ||
            event.getLoggerName().startsWith(LoggerUtils.TASK_STEP_LOGGER_PREFIX) ||
            !event.getLevel().isGreaterOrEqual(level)) {
        return FilterReply.DENY;
    }
    // 接受其他符合条件的日志
    return FilterReply.ACCEPT;
}


}
